為了讓使用者的密碼更安全,昨天介紹了所謂的「加鹽雜湊」,雖然加鹽雜湊已經足夠應付現今 CPU 的計算速度,就算要破解出原密碼也要花很久的時間,但以後的 CPU 還會越來越快,說不定再過不了多少年就又快個十倍,因此今天要介紹其他更不容易被破解的演算法,讓你的 API Server 用了他之後可以很久很久都不必再擔心密碼安全性的問題
追根究底,單純的 SHA1、SHA256 這類的雜湊之所以不管用了,是因為這些雜湊演算法對 CPU 來說都太簡單了,現在的電腦霹哩啪拉一下子就可以算個幾萬次
而且這些演算法在設計之時本來就有考慮到要讓 CPU 快速運算,因為當時的電腦根本不夠快,所以演算法本身當然是跑得越快越好,這樣一來在以前運算能力還不夠強的時代跑起來才不致於太慢
但時代已經不同了,以前對 CPU 來說還算有點難度的任務,現在簡直是輕而易舉,所以現在的 CPU 才可以用超快的速度去建表,進而破解出原本的密碼
為了解決上述的問題,於是就有人發明了像 Bcrypt 這類的慢雜湊演算法。雖然 Bcrypt 的名字裡面有個 crypt,但他並不是加密法,而是跟 SHA1 一樣是雜湊演算法,唯一的差別是他計算很慢
計算慢有什麼好處呢?前面有提到 SHA1 的雜湊值之所以可以被反查出來,就是因為現今的電腦計算太快了,就連建個表反查也不需要太多時間。而 Bcrypt 則是可以透過設定疊代次數讓計算速度變慢,以疊代五次的 Bcrypt 來說,他的計算速度大概比 SHA1 慢 1000 倍。也就是說,假如你原本用 SHA1 計算三天就能反查出所有使用者的密碼,現在卻要花大概八年的時間才可以。下圖就是使用者的密碼經過 Bcrypt 的結果,hash 出來總共有 60 個字元,很長很長
當使用者要登入、註冊時也是跟先前一樣的做法,就把密碼直接丟進去 Bcrypt 雜湊,雖然雜湊的過程會比 SHA1 慢一千倍,但整體而言單次雜湊還是非常快的,所以並不會有什麼問題
而且用 Bcrypt 還有另一個好處,因為以後電腦的運算速度還會更快,這時只要把疊代次數設定得更高就好了,疊代次數每增加 1 需要的時間就變兩倍,所以只要疊代次數一直加上去,就非常非常難被破解
以目前電腦的運算能力來說,身為網站的開發人員,至少要做到昨天提到的 加鹽雜湊 才能保證使用者的密碼不會輕易被破解,但因為運算速度只會越來越快,所以可以的話建議還是用今天講的 Bcrypt 慢雜湊,才不會讓使用者的密碼暴露在風險之中
身為使用者,因為我們無法確定所有網站的後端都是用足夠安全的方式保存密碼,畢竟就連 Facebook 這麼大的公司都曾經存過明碼。所以唯一能做的就是把密碼設得複雜一點、不同網站使用不同的密碼,並且用 KeePass、Bitwarden 這類的密碼管理軟體,才不會被那些爛網站雷到~